package com.bookstore.dao;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JdbcUtils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.List;

/**
 * Dao 接口,定义Dao 的基本操作,由BaseDao 提供实现
 * @param <T>: Dao 实际操作的泛型类型
 */

public interface DAO<T> {
    /**
     * 执行insert 的操作,返回插入后的记录的ID
     * @param sql: 待执行的语句
     * @param args: 填充占位符的可变参数
     * @return: 返回新的记录的 id
     */
    long insert(String sql, Object... args);

    /**
     * 执行 update 的操作,包括insert ,update ,delete ;
     * @param sql: 待执行的语句
     * @param args: 填充占位符的可变参数
     */
    void update(String sql, Object... args);

    /**
     * 执行单条记录的查询,返回与记录对应的类的一个对象
     * @param sql: 待执行的语句
     * @param args: 填充占位符的可变参数
     * @return
     */
    T get(String sql, Object... args);

    /**
     * 执行多条记录的查询操作,返回对应的一个类的List
     * @param sql: 待执行的语句
     * @param args: 填充占位符的可变参数
     * @return
     */
    List<T> getForList(String sql, Object... args);

    /**
     * 执行一个属性或值的查询操作,例如查询某一条记录的一个字段,
     * 或者某个统计信息,返回要查询的值
     * @param sql: 待执行语句
     * @param args: 填充占位符的可变参数
     * @param <E>
     * @return:
     */
    <E> E getForValue(String sql, Object... args);

    /**
     * 执行批量更新操作
     * @param sql
     * @param params
     */
    void batch(String sql, Object[]... params);
}
